package com.hb.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceView;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * 1、有多种方式来配置 DispatcherServlet，与之类似，启用 SpringMVC 组件的方法也不仅一种。以前，Spring 是使用 XML 进行配置的，你可以使用 <mvc:annotation-driven />
 * 启用注解驱动的 SpringMVC。
 * 2、如果没有配置视图解析器。Spring 默认会使用 BeanNameViewResolver，这个视图解析器会查找 ID 与视图名称匹配的 bean，并且查找的 bean 要实现 View 接口（这个 bean 其实就是视图对象），
 * 它以这样的方式来解析视图；如果没有启用组件扫描，那么 Spring 只能找到显式声明在配置类中的控制器；如果只使用 @Configuration 和 @EnableWebMvc 这两个注解标注的配置类时，这个配置类属于
 * 最小的 SpringMVC 配置，此时 DispatcherServlet 会映射为应用的默认 Servlet，所以它会处理所有的请求，包括对静态资源的请求，如图片和样式表（在大多数情况下，这可能并不是你想要的效果）。
 */
@Configuration
@EnableWebMvc   // 启用 SpringMVC
@ComponentScan(basePackageClasses = com.hb.web.ComponentScanFlagClass.class)    // 启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ViewResolver viewResolver() {
        // 配置 JSP 视图解析器
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    /**
     * 配置静态资源的处理
     * 我们要求 DispatcherServlet 将对静态资源的请求转发到 Servlet 容器中默认的 Servlet 上，而不是使用 DispatcherServlet 本身来处理此类请求。
     * @param configurer
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // 通过启用默认 Servlet 处理配置后 DispatcherServlet 将对静态资源的请求转发到 Servlet 容器中默认的 Servlet 上，而不是使用 DispatcherServlet 本身来处理此类请求
        configurer.enable();
    }
}
